#include "user.h"
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <thread>         // std::thread
#include <mutex>          // std::mutex 

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream> 
//#define _GLIBCXX_USE_CXX11_ABI 0
#include "IODrive.h"

//控制摄像头捕获变量
bool enableCamer_1 = true;
bool enableCamer_2 = true;

extern IODrive *allChannel;
mutex imshow_mtx;
mutex uart2T_mtx;
mutex uart3T_mtx;

/* 串口2发送数据 */
void uart2Send(const char *buf)
{
    #ifdef USING_UART2
    uart2T_mtx.lock();
    allChannel->Uart2->Send(buf, strlen(buf));
    uart2T_mtx.unlock();
    #endif // USING_UART2
}


/* 串口3发送数据 */
void uart3Send(const char *buf)
{
    #ifdef USING_UART3
    uart3T_mtx.lock();
    allChannel->Uart3->Send(buf, strlen(buf));
    uart3T_mtx.unlock();
    #endif // USING_UART3
}



/** 显示图像调用这个函数，不要调用imshow　**/
void show_pic(const char *winName, Mat frame, int tid)
{
#ifdef SHOW_PIC
   #ifdef SHOW_AllPIC
   if(strlen(winName) > 15)
   {
       printf("in show_pic: winName is too long\n");
   }
    char name[20] = {0};
    sprintf(name,"%s_t%d",winName,tid);
    imshow_mtx.lock();
    imshow(name, frame);
    imshow_mtx.unlock();
   #else
    if(tid == 0)
    {
        imshow(winName, frame);
    }
   #endif // SHOW_AllPIC
#endif // SHOW_PIC
}

/*
为用户提供的初始化接口
*/
bool userInit()
{
    printf("hello world\n");
    return true;
}


/*
串口２数据处理函数，直接返回有效数据
数据格式：帧头($) 数据段 帧尾(#)
eg:32使用串口发送一祯数据：$abcdefg#
则data的值为：abcdefg
*/
void uart2Handler(char *data)
{
    printf("uart2 recv data: %s\n",data);
    /** 串口2数据处理在此处进行即可 **/
}


/* 串口３　数据处理函数　*/
void uart3Handler(char *data)
{
    printf("uart3 recv data: %s\n",data);
}


/**
单目摄像头图像处理接口
frame 为摄像头的原始图像，可以直接使用，无需释放
**/
void pic_dispose(Mat &frame,int tid)
{
    double t = (double)cvGetTickCount();

    Mat dst, s_frame;
    s_frame = frame;
    show_pic("video",s_frame, tid); 
    cout << "******" << s_frame.cols << s_frame.rows << endl;
    /** 随便写了些图像处理，测试以下部分耗时70ms左右时，帧率可达25帧左右 **/
	/*
    Sobel(frame, dst, frame.depth(), 1, 0);
    Mat dstImage, edge, grayImage;
	dstImage.create(frame.size(), frame.type());
	cvtColor(frame, grayImage, CV_BGR2GRAY);
	blur(grayImage, edge, Size(3, 3));
	Canny(edge, edge, 3, 9, 3);
	Canny(edge, edge, 3, 9, 3);
	Canny(edge, edge, 3, 9, 3);
    //show_pic("video_2",dst , tid);

	
    uart3Send("asdfui#");
    t = (double)cvGetTickCount() - t;
    printf("time = %gms\n", t / ((double)cvGetTickFrequency()*1000.));
	*/
}

/**
双目摄像头图像处理接口
frame_1为摄像头0的原始图像
frame_2为摄像头1的原始图像
**/
void pic_dispose_2(Mat &frame_1, Mat &frame_2,int tid)
{
	//改变变量值实现某个摄像头的捕获（可能需要销毁图像：src.release()）
	/*enableCamer_1 = true;
	enableCamer_2 = true;*/

    show_pic("video",frame_1 , tid);
    show_pic("video_2",frame_2, tid);
}







